#include <type.h>

string inner_to_json_string(mixed data);
string to_json_string(mixed data);

// 内部json字符串的生成
// 内部json生成的类型: mapping, array, float, int, string
// https://wiki.mud.ren/index.php?title=Typeof
string inner_to_json_string(mixed data){
    string json_str = "";
    string json_body_str = "";
    string data_type = typeof(data);

    if (data_type == T_MAPPING)
    {
        json_str += "{";
        foreach(int key in keys(data))
        {
            json_body_str += ("\""+key+"\"");
            json_body_str += ":";
            json_body_str += inner_to_json_string(data[key]);
            json_body_str += ",";
        }
        if(sizeof(json_body_str)>0){
            json_str += json_body_str[0..(sizeof(json_body_str) - 2)];
        }
        json_str += "}";
    }

    else if(data_type == T_ARRAY){
        json_str += "[";
        foreach(mixed elem in data)
        {
            json_body_str += inner_to_json_string(elem);
            json_body_str += ",";
        }
        if(sizeof(json_body_str)>0){
            json_str += json_body_str[0..(sizeof(json_body_str) - 2)];
        }
        json_str += "]";
    }

    else if(data_type == T_FLOAT){
        json_str += sprintf("%f", data);
    }

    else if(data_type == T_INT){
        json_str += sprintf("%d", data);
    }

    else if(data_type == T_STRING){
        data = replace_string(data, "\\", "\\\\");
        data = replace_string(data, "\"", "\\\"");
        data = replace_string(data, "\b", "\\b");
        data = replace_string(data, "\f", "\\f");
        data = replace_string(data, "\t", "\\t");
        json_str += "\""+sprintf("%s", data)+"\"";
    }

    return json_str;
}

// json字符串的生成
// json字符串的生成类型: mapping, array
string to_json_string(mixed data){
    string json_str = "";
    string json_body_str = "";
    string data_type = typeof(data);
    if (data_type == T_MAPPING)
    {
        json_str += "{";
        foreach(int key in keys(data))
        {
            json_body_str += ("\""+key+"\"");
            json_body_str += ":";
            json_body_str += inner_to_json_string(data[key]);
            json_body_str += ",";
        }
        if(sizeof(json_body_str)>0){
            json_str += json_body_str[0..(sizeof(json_body_str) - 2)];
        }
        json_str += "}";
    }else if(data_type == T_ARRAY){
        json_str += "[";
        foreach(mixed elem in data)
        {
            json_body_str += inner_to_json_string(elem);
            json_body_str += ",";
        }
        if(sizeof(json_body_str)>0){
            json_str += json_body_str[0..(sizeof(json_body_str) - 2)];
        }
        json_str += "]";
    }else{
        json_str += "{}";
    }
    return json_str;
}
